iT邦幫忙

2024 iThome 鐵人賽

DAY 21
0

昨日介紹了事務的4個特性,其中的隔離性(Isolation),在處理高併發系統時是非常重要的。它確保了多個事務在同時運行時能夠互不干擾,從而避免發生資料不一致的狀況。

它能夠防止發生以下資料讀取問題:

  • 髒讀(Dirty Read),意旨一個事務正在存取資料,並對資料進行了修改,而在修改還沒有被提交(Commit)到資料庫的同時,另一個事務讀取了尚未提交的資料,假設事務最後回滾了,那麼讀到的資料會是錯誤的。
    假設事務A正在存取資料但尚未提交,事務B讀到了事務A尚未提交的資料,如果事務A操作失敗RollBack後,事務B讀到的資料就會是有問題的。

  • 不可重複讀取(Non-repeatable Read),表示一個事務在重複讀取兩次相同的資料時,會得到不一樣的結果。
    假設事務A正在讀取一筆資料,恰巧事務B也在讀取資料並且修改了資料內容也完成了提交,事務A再次讀取時發現資料與第一次讀取的結果不一致。

  • 幻讀(Phantom Read),代表事務在查詢時,另一個事務新增或刪除了一筆資料,導致事務第二次查詢時多了一筆資料或是少了一筆資料。
    假設事務A透過指定條件查詢得到了10筆資料,事務B新增了一筆符合事務A查詢條件的資料,當事務A發起第二次查詢時得到了11筆資料。

在標準SQL規範中定義了事務隔離的4個層級,根據效能最好但一致性最差到效能最差但一致性最好的排序如下:

  • 讀取未提交資料( Read Uncommitted ),這是最低等級的隔離層級,它允許事務讀取其他事務尚未提交的變更。在這種隔離層級下,髒讀、不可重複讀取、幻讀等問題都有可能發生。
  • 讀取提交資料( Read Committed ),此隔離層級保證了事務不會讀取到另一個事務已修改但尚未提交的資料內容。在這種隔離層級下可避免髒讀,但仍有機會發生不可重複讀取和幻讀的問題。
  • 可重複讀取( Repeatable Read ),可以確保事務在多次讀取同一筆資料的一致性,防止發生髒讀和不可重複讀取的問題。此層級無法阻止其他事務新增資料,所以仍可能發生幻讀的問題。
  • 序列化( Serializable ),隔離層級中的最高級別,徹底地避免了髒讀、不可重複讀取、幻讀的問題發生,所有事務會依照次序執行(猶如單一執行緒般)。雖然此層級避免了所有併發讀取問題,但其犧牲的就是系統效能,因為所有事務都須一一排隊等待。
隔離層級 發生髒讀 可重複讀取 發生幻讀
Read Uncommitted
Read Committed
Repeatable Read
Serializable

上一篇
Day20 - Spring 中的事務(上)
下一篇
Day22 - Spring 中的事務(下)
系列文
這些年SpringBoot實戰開發教會我的事30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言